import axios from 'axios'
import router from '@/router'
import { ElMessage, ElMessageBox } from 'element-plus'
import { tryRefreshToken } from './refreshToken'
// import { useRouter } from 'vue-router'

// 登录异常弹窗处理
let isLogin = true
const CODE = {
  LOGIN_TIMEOUT: 1000,
  REQUEST_SUCCESS: 200,
  REQUEST_FOBID: 1001
}
// const router = useRouter()
const baseURL = 'http://121.37.242.119:10000'
// const baseURL = 'http://localhost:10000'

const instance = axios.create({
  // TODO 1. 基础地址，超时时间
  baseURL,
  withCredentials: false,
  timeout: 10000
})

//请求拦截器
instance.interceptors.request.use((config) => {
  const TOKEN = sessionStorage.getItem('token')
  config.headers = {
    'Content-Type': 'application/json',
    authorization: TOKEN
  }
  return config
})
instance.defaults.timeout = 5000
async function refreshToken(err) {
  // 尝试刷新token
  let success = await tryRefreshToken()
  if (success) {
    // refreshing.value = false;
    return instance(err.config)
  }
  // refreshing.value = false;
  ElMessageBox.alert('请先登录！', '未登录或登录超时', {
    confirmButtonText: '重新登录',
    callback: () => {
      router.push('/login')
    }
  })
  return true
}
//响应拦截器
instance.interceptors.response.use(
  (res) => {
    // TODO 3. 处理业务失败
    // TODO 4. 摘取核心响应数据
    if (res.data.code == 200) {
      //注意后端返回数据的层级
      return res
    }
    //处理业务失败，给错误提示并抛出错误
    ElMessage.error(res.data.msg || '服务异常')
    return Promise.reject(res.data)
  },
  (err) => {
    // TODO 5. 处理401错误  权限不足或token过期
    if (err.response?.status === 401) {
      router.push('/login')
    }
    //错误默认情况=》给提示
    ElMessage.error(err.response.data.msg || '服务异常')
    return Promise.reject(err)
  }
)
function alertLoginMessage() {
  isLogin = false
  sessionStorage.removeItem('userInfo')
  sessionStorage.removeItem('token')
  ElMessageBox.confirm(
    '您的账号登录超时或在其他机器登录，请重新登录或更换账号登录！',
    '登录超时',
    {
      confirmButtonText: '重新登录',
      cancelButtonText: '继续浏览',
      type: 'warning'
    }
  )
    .then(() => {
      router.push('/login')
    })
    .catch(() => {
      router.go(0)
    })
}
// const sleep = (delay) => new Promise((resolve) => setTimeout(resolve, delay))
instance.interceptors.response.use(
  async (response) => {
    // 1.获取业务状态码
    let code = response.data.code
    // 2.业务状态码为200，直接返回
    if (code === CODE.REQUEST_SUCCESS) {
      return response.data
    }

    // 3.业务状态码为401，代表未登录
    if (code === 401 && isLogin) {
      isLogin = false
      alertLoginMessage()
    }

    return response.data
    /*    // 4.业务状态码为其它，返回异常
    ElMessage({
      message: response.data.msg,
      type: 'error'
    });
    throw new Error(response.data.msg);*/
  },
  async (err) => {
    if (err.response.status === 401 && isLogin) {
      // 登录异常或超时，刷新token
      return refreshToken(err)
    }
    // refreshing = false;
    return Promise.reject(err)
  }
)
export default instance
export { baseURL }
